from modelscope.msdatasets import MsDataset
from modelscope.utils.constant import DownloadMode

ms_train_dataset = MsDataset.load(
            'cats_and_dogs', namespace='tany0699',
            subset_name='default', split='train') # 加载训练集
print(next(iter(ms_train_dataset)))

ms_val_dataset = MsDataset.load(
            'cats_and_dogs', namespace='tany0699',
            subset_name='default', split='validation') # 加载验证集
print(next(iter(ms_val_dataset)))
# 导入MsDataset类，用于加载ModelScope平台上的数据集
from modelscope.msdatasets import MsDataset
# 导入DownloadMode常量，通常用于指定数据集的下载模式，但在这段代码中未使用
from modelscope.utils.constant import DownloadMode

# 使用MsDataset类的load方法加载名为'cats_and_dogs'的训练数据集，指定了命名空间和分割方式为'train'
ms_train_dataset = MsDataset.load(
    'cats_and_dogs', namespace='tany0699',
    subset_name='default', split='train')  # 加载训练集
# 注释掉的代码用于打印训练数据集的第一个元素，用于调试
# print(next(iter(ms_train_dataset)))

# 使用与上面相同的方式加载验证数据集，分割方式为'validation'
ms_val_dataset = MsDataset.load(
    'cats_and_dogs', namespace='tany0699',
    subset_name='default', split='validation')  # 加载验证集
# 注释掉的代码用于打印验证数据集的第一个元素，用于调试
# print(next(iter(ms_val_dataset)))

# 导入csv模块，用于处理CSV文件，但在这段代码中未使用
import csv
# 导入os模块，用于操作系统相关的功能
import os
# 导入transforms模块，用于图像预处理
from torchvision import transforms
# 导入Image类，用于图像的读取和操作
from PIL import Image
# 导入Dataset基类，用于自定义数据集
from torch.utils.data import Dataset


# 定义一个自定义数据集类DatasetLoader，继承自torch.utils.data.Dataset
class DatasetLoader(Dataset):
    # 初始化方法，接收一个参数data，通常是一个包含多个样本的列表或字典
    def __init__(self, data):
        self.data = data

        # 定义一个图像预处理方法，接收一个图像路径，返回预处理后的图像张量

    def preprocess_image(self, image_path):
        # 使用PIL库打开图像
        image = Image.open(image_path)
        # 定义一个图像变换序列，包括缩放、转为张量和标准化
        image_transform = transforms.Compose([
            transforms.Resize((256, 256)),  # 将图像缩放到256x256大小
            transforms.ToTensor(),  # 将PIL图像转为PyTorch张量
            transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # 标准化图像
        ])

        # 应用图像变换并返回结果
        return image_transform(image)

        # 重写__getitem__方法，使其能够根据索引返回单个样本

    def __getitem__(self, index):
        # 从self.data中获取指定索引的图像路径和标签
        image_path, label = self.data[index]['image:FILE'], self.data[index]['category']
        # 调用preprocess_image方法对图像进行预处理
        image = self.preprocess_image(image_path)
        # 返回图像张量和整数标签
        return image, int(label)

        # 重写__len__方法，返回数据集的大小

    def __len__(self):
        return len(self.data)

    # 使用自定义的DatasetLoader类包装从MsDataset加载的训练数据集


data_train = DatasetLoader(ms_train_dataset)
